"""
作用域：变量可以使用的范围，程序的变量并不是在哪个位置都可以访问的，
访问的权限决定于这个变量在哪里赋值

作用域的划分：
    1、局部作用域（L)
    2、闭包函数外到函数中(E)
    3、全局作用域(G)
    4、内建作用域(B)

变量查找规则：
    L->E->G->B，首先在自身作用域中查找，找不到依次向上级作用域中查找
    不会向低级作用域中查找。

python中只有模块，类，和函数才会引入新的作用域，其他的代码块比如（if,
elif,else,for,while,try,except不会引入新的作用域

"""
#体现作用域
num = 0#全局作用域
if 1:
    index = 10
    print("num = %d"%num)
print("index = %d"%index)

def func(x, y):
    #取值的使用
    print("在func中使用num:%d"%num)
    #定义局部变量
    temp = 10
    return x+y
print(func(1,2))
#在全局中使用局部变量，找不到的
#print("temp = %d"%temp)

#修改全局变量
#在函数内部可以直接获取全局变量的值，但是不能直接修改全局变量的值
#直接修改相当于定义一个新的局部变量，没有修改到全局变量本身

num1 = 10
print(id(num1))
def func1():
    #需要将定义的变量声明成全局变量
    global num1
    num1 = 20
    print(id(num1))
    print("num1 = %d"%num1)
func1()
print("num1 = %d"%num1)

#修改嵌套作用域中的变量
def func2():
    #global a  #
    # 有global会在nonlocal那里报错，声明为全局的后就没有嵌套的了
    a = 10
    def f():
        #修改嵌套作用域中的变量，需要将他声明
        nonlocal a
        a = 20
        print("1----a = %d"%a)
    f()
    print("2-----a = %d"%a)
func2()


